<?php

declare(strict_types=1);

namespace app\cron\controller;

use app\BaseController;
use app\system\model\Cron;

class Index extends BaseController
{

    /**
     * 获取应用内带有计划任务的配置文件
     * @return array 返回配置文件
     */
    private function getFiles()
    {
        $files = [];
        $dirs = glob(base_path() . '*');
        foreach ($dirs as $dir) {
            if (is_dir($dir)) {
                $lock = $dir . '/config/clock.php';
                if (file_exists($lock)) {
                    $files[] = $lock;
                }
            }
        }
        return $files;
    }

    /**
     * 计划任务执行页面
     */
    public function index()
    {
        set_time_limit(0); // 脚本不限执行时间
        $files = $this->getFiles();
        if (empty($files)) {
            return '没有需要执行的任务';
        }
        foreach ($files as $file) {
            $this->processFile($file);
        }
    }

    /**
     * 执行计划任务文件
     * @param string $file 任务文件
     */
    private function processFile($file)
    {
        $data = include $file;
        foreach ($data as $value) {
            if ($value['status'] == 0 && $value['callback']) {
                $this->executeCallback($value['callback']);
            }
        }
    }

    /**
     * 执行回调函数
     * @param string $callback 回调方法
     */
    private function executeCallback($callback)
    {
        $crons = Cron::column('*', 'name');
        [$className, $methodName] = explode('@', $callback);
        if (class_exists($className) && method_exists($className, $methodName)) {
            $object = new $className();
            $object->$methodName($crons);
        }
    }
}
